<?php
/**
 * Created by PhpStorm.
 * User: yuanxr
 * Date: 2018/6/10
 * Time: 上午8:32
 */

namespace Utility\Cache;
use Utility\Extend\EArray;
use Utility\Data\Mysql;
use Utility\Data\Tsql;
use Utility\Data\Asql;
use \Exception;

/**
 * 实现数据同步的类
 * 一般用于同步缓存或者执行sql时执行其他附件操作
 */
class Sync
{

    private $_EArray;
    private $_Mysql;
    private $_Tsql;
    private $_Asql;

    function __construct(){
        $this->_EArray = new EArray();
        $this->_Mysql = new Mysql();
        $this->_Tsql = new Tsql();
        $this->_Asql = new Asql();
    }

    /**
     * @param array $db 数据库的连接信息
     * @param array $sqls 数据库的执行语句
     * @param array $params 数据库sql的附件参数
     * @param string $function_sync 附件方法的名称
     * @param var $data 带入方法的执行参数数据
     * 同步写入数据库且写入其他缓存或者库 
     * $function_sync执行同步或者其他操作的函数
     */
    public function write(array $db, $sqls, $params = null, $function_sync=null, $data=null){
        return $this->_EArray->hasKey($db, 'database') ? $this->_Asql->writeSyn($db, $sqls, $params, $function_sync, $data) : $this->_Tsql->writeSyn($db, $sqls, $params, $function_sync, $data);
    }

    /**
     * @param array $db 数据库的连接信息
     * @param array $sqls 数据库的执行语句
     * @param array $params 数据库sql的附件参数
     * @param string $function_sync 附件方法的名称
     * @param var $data 带入方法的执行参数数据
     * 同步写入函数并取出出入后的值的id
     * $function_sync执行同步或者其他操作的函数
     */
    public function lastid(array $db, string $sql, $params = null, $function_sync=null, $data){
        return $this->_EArray->hasKey($db, 'database') ? $this->_Asql->lastidSyn($db, $sql, $params, $function_sync, $data) : $this->_Tsql->lastidSyn($db, $sql, $params, $function_sync, $data);

    }

    /**
     * @param array $db 数据库的连接信息
     * @param array $sqls 数据库的执行语句
     * @param array $params 数据库sql的附件参数
     * @param string $function_sync 附件方法的名称
     * 查询同步(可用于整体查询同步)
     * $function_sync执行同步或者其他操作的函数
     */
    public function syndata(array $db, $sqls, $params = null, $function_sync){
        $result = $this->_Mysql->query($db, $sqls, $params);
        if($function_sync){
            if(!$function_sync($result)){
                try {
                    throw new Exception('注入方法执行错误');
                }catch(Exception $e){
                    echo $e->getMessage();exit();
                }
            } 
        }
    } 
    
    /**
     * @param array $db 数据库的连接信息
     * @param array $sqls 数据库的执行语句
     * @param array $params 数据库sql的附件参数
     * @param string $function_sync 附件方法的名称
     * 实时缓存数据查询
     * $function_sync执行读取缓存数据或者其他操作
     * $function_sync需要是返回数据没有数据返回false
     * $function_sync需要返回的是数组以保持与数据库查出来的数据类型一致
     */
    public function query(array $db, $sqls, $params = null, $function_sync){
        //重新获取次数
        $execute_num = 2;
        $result = null;
        for($i=0;$i<$execute_num;$i++){
            $result = $function_sync();
            if($result){
                break;
            }elseif($i == $execute_num-1){
                $result = $this->_Mysql->query($db, $sqls, $params);
                break;
            }
        }
        if($result){
            return $result;
        }else{
            try {
                throw new Exception('读取数据异常');
            }catch(Exception $e){
                echo $e->getMessage();exit();
            }
        }
    }

}